package com.aviatorscript.aviatorscript.common;

import lombok.Data;

/**
 * 通用API响应结果类
 * 统一封装所有接口的返回结果
 */
@Data
public class Result<T> {

    /**
     * 响应状态码 - 200表示成功，其他表示失败
     */
    private Integer code;

    /**
     * 响应消息 - 成功或失败的描述信息
     */
    private String message;

    /**
     * 响应数据 - 泛型，可以是任意类型的数据
     */
    private T data;

    /**
     * 请求时间戳 - 用于调试和日志追踪
     */
    private Long timestamp;

    /**
     * 私有构造函数，防止外部直接实例化
     */
    private Result() {
        this.timestamp = System.currentTimeMillis();
    }

    /**
     * 成功响应 - 不返回数据
     * @return 成功结果
     */
    public static <T> Result<T> success() {
        Result<T> result = new Result<>();
        result.code = 200;
        result.message = "操作成功";
        return result;
    }

    /**
     * 成功响应 - 返回数据
     * @param data 要返回的数据
     * @return 成功结果
     */
    public static <T> Result<T> success(T data) {
        Result<T> result = new Result<>();
        result.code = 200;
        result.message = "操作成功";
        result.data = data;
        return result;
    }

    /**
     * 成功响应 - 自定义消息
     * @param message 自定义成功消息
     * @param data 要返回的数据
     * @return 成功结果
     */
    public static <T> Result<T> success(String message, T data) {
        Result<T> result = new Result<>();
        result.code = 200;
        result.message = message;
        result.data = data;
        return result;
    }

    /**
     * 失败响应 - 默认错误码和消息
     * @return 失败结果
     */
    public static <T> Result<T> error() {
        Result<T> result = new Result<>();
        result.code = 500;
        result.message = "操作失败";
        return result;
    }

    /**
     * 失败响应 - 自定义错误消息
     * @param message 错误消息
     * @return 失败结果
     */
    public static <T> Result<T> error(String message) {
        Result<T> result = new Result<>();
        result.code = 500;
        result.message = message;
        return result;
    }

    /**
     * 失败响应 - 自定义错误码和消息
     * @param code 错误码
     * @param message 错误消息
     * @return 失败结果
     */
    public static <T> Result<T> error(Integer code, String message) {
        Result<T> result = new Result<>();
        result.code = code;
        result.message = message;
        return result;
    }

    /**
     * 判断是否成功
     * @return true表示成功，false表示失败
     */
    public boolean isSuccess() {
        return this.code != null && this.code == 200;
    }
} 